package model;

import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Pattern;

/**
 * description: 获取键盘输入规则类
 * author: 时间
 * time: 2022-01-09-11:00
 */
public class ScanRead {
    private static final Scanner scan = new Scanner(System.in);
    // 数字
    private static final String RE_NUMBER = ".*[0-9]+.*";
    // 字母
    public static final String RE_CASE = ".*[A-Za-z]+.*";
    // 特殊符号
    public static final String RE_SYMBOL = ".*[~!@#$%^&*()_+|<>,.?/:;'\\[\\]{}\"]+.*";


    /**
     * Description: 键盘输入规则，参数：最小长度，最大长度（左开右闭），是否可以返回空值，返回一个String类型
     * Author: 时间
     * Date: 2022/1/9 11:03
     */
    private static String readKeyBoard(int limitStart, int limitEnd, boolean blankReturn) {
        String line = "";
        // hasNextLine:Returns true if there is another line in the input of this scanner.
        while (scan.hasNextLine()) {
            // nextLine:Advances this scanner past the current line and returns the input that was skipped.
            line = scan.nextLine();
            if (line.length() == 0) {
                if (blankReturn)
                    return line;
                else
                    continue;
            }  //  用于在输入过程中输入为-1时退出
            if (line.equals("-1")){
                return line;
            }
            if (line.length() >= limitEnd) {
                System.out.print("输入长度不能大于或等于" + limitEnd + "，请重新输入:");
                continue;
            }else if (line.length() < limitStart){
                System.out.print("输入长度不能小于" + limitStart + "，请重新输入:");
                continue;
            }
            break;
        }
        return line;
    }

    /**
     * Description: 返回一个10位或12位的String类型字符串(作为学号或工号)
     * Author: 时间
     * Date: 2022/1/9 11:12
     */
    public static String readNumber(){
        String str;
        // 正则匹配，检测是否全部输入都为数值
        Pattern pattern = Pattern.compile("[0-9]*");
        while (true){
            str = readKeyBoard(10, 13, false);
            // 匹配所有字符串都必须是数字
            if (str.equals("-1")){
                return str;
            }
            if (pattern.matcher(str).matches()){
                if (str.length() == 10 || str.length() == 12){
                    return str;
                }else {
                    System.out.print("你输入的学号（12位）或工号（10位）不正确，请重新输入：");
                }
            }else {
                System.out.print("学号/工号由（0-9）的数字组成，请重新输入：");
            }
        }
    }

    /**
     * Description: 返回一个8位String类型字符串（作为管理员账号的获取）
     * Author: 时间
     * Date: 2022/1/11 10:42
     */
    public static String readAccount(){
        String str;
        Pattern pattern = Pattern.compile("[0-9]*");
        while (true){
            str = readKeyBoard(8, 9, false);
            if (str.equals("-1")){
                return str;
            }
            if (pattern.matcher(str).matches()){
                return str;
            }else{
                System.out.print("管理员账号由（0-9）的数字组成，请重新输入：");
            }
        }
    }

    /**
     * Description: 返回一个8-16位String类型的字符(作为密码)
     * Author: 时间
     * Date: 2022/1/9 12:20
     */
    public static String readPassword(){
        String str;
        while (true){
            str = readKeyBoard(8, 17, false);
            if (str.equals("-1")){
                return str;
            }
            // 正则检测字符串是否包含字母和数字
            int count = 0;
            if (str.matches(RE_CASE)){
                count++;
            }
            if (str.matches(RE_NUMBER)){
                count++;
            }
            if(str.matches(RE_SYMBOL)){
                count++;
            }
            if (count >= 2){
                return str;
            } else{
                System.out.print("密码必须包含数字，字母，字符的两种，请重新输入：");
            }
        }
    }

    /**
     * Description: 键盘输入一个char型字符(1, 2, 3， 4， 5)，用于登录界面的选择
     * Author: 时间
     * Date: 2022/1/10 12:03
     */
    public static char readLogin(){
        char chr;
        while (true){
            String str = readKeyBoard(1, 2, false);
            chr = str.charAt(0);
            if (chr != '1' && chr != '2' && chr != '3' && chr != '4' && chr != '5'){
                System.out.print("选择错误，请重新输入：");
            }else {
                break;
            }
        }
        return chr;
    }

    /**
     * Description: 回车继续
     * Author: 时间
     * Date: 2022/1/10 12:17
     */
    public static void readReturn() {
        System.out.print("按回车继续....");
        readKeyBoard(99, 100, true);
    }

    /**
     * Description: 返回一个char型（y/n），用于选择判断
     * Author: 时间
     * Date: 2022/1/10 12:21
     */
    public static char readSelection() {
        char c;
        while(true) {
            // toUpperCase()方法，转大写
            String str = readKeyBoard(1, 2, false).toUpperCase();
            c = str.charAt(0);
            if (c == 'Y' || c == 'N'){
                break;
            }else {
                System.out.print("输入有误，请重新输入：");
            }
        }
        return c;
    }

    /**
     * Description: 返回一个四位的随机验证码（用于修改密码模仿验证信息）
     * Author: 时间&&饼干
     * Date: 2022/1/11 11:42
     * @return
     */
    public static int readValidation(){
        Random rd=new Random();
        return rd.nextInt(8999)+1000;
    }

    /**
     * Description: 返回一个1-6的char类型的字符（用于主界面的选择）
     * Author: 时间
     * Date: 2022/1/11 11:45
     */
    public static char readMenu(){
        char chr;
        while (true){
            String str = readKeyBoard(1, 2, false);
            chr = str.charAt(0);
            if (chr != '1' && chr != '2' && chr != '3' && chr != '4' && chr != '5' && chr != '6'){
                System.out.print("选择错误，请重新输入：");
            }else {
                break;
            }
        }
        return chr;
    }

    /**
     * Description: 返回一个1~12位的String类型的字符串（用于教室号的选择，教室类型的输入，备注信息,手机号，预约时间）
     * Author: 时间&&饼干
     * Date: 2022/1/11 11:50
     */
    public static String readClassroom(){
        String str1;
        while(true){
            str1=readKeyBoard(1,12,false);
            if(str1.length()>12){
               System.out.println("输入有误，请重新输入");
           }
           else break;
        }
        return str1;
    }

    /**
     * Description: 返回一个1、2的char型字符（用于个人信息界面的选择）
     * Author: 时间&&饼干
     * Date: 2022/1/12 11:24
     */
    public static char readOptionTwo(){
        char chr;
        while (true){
            String str = readKeyBoard(1, 2, false);
            chr = str.charAt(0);
            if (chr != '1' && chr != '2'){
                System.out.print("选择错误，请重新输入：");
            }else {
                break;
            }
        }
        return chr;
    }

    /**
     * Description: 读教室号
     * Author: 时间
     * Date: 2022/1/14 15:28
     */
    public static String readClassNum(){
        String str;
        while (true){
            str = readKeyBoard(4, 5, false);
            if (str.charAt(0) != 'A' && str.charAt(0) != 'B' && str.charAt(0) != 'C'){
                System.out.println("教室号的格式为(A101),请重新输入：");
            }else {
                break;
            }
        }
        return str;
    }

    /**
     * Description: 手机号获取
     * Author: 时间
     * Date: 2022/1/14 15:37
     */
    public static String readPhone(){
        String str;
        Pattern pattern = Pattern.compile("[0-9]*");
        while (true){
            str = readKeyBoard(11, 12, false);
            // 匹配所有字符串都必须是数字
            if (str.equals("-1")){
                return str;
            }
            if (pattern.matcher(str).matches()) {
                return str;
            }else {
                System.out.print("手机号由（0-9）的数字组成，请重新输入：");
            }
        }
    }

    /**
     * Description: 日期获取
     * Author: 凯
     * Date: 2022/1/15 15：09
     */

    public static String readOrderDate(){

        Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT+08:00"));
        int tmonth = c.get(Calendar.MONTH) + 1; //当前月
        int tday = c.get(Calendar.DAY_OF_MONTH);//当日
        String str;
        while (true){
            str = readKeyBoard(3,6,false);
            String[] strarray = str.split("\\.");   //分割字符串
            int month = Integer.parseInt(strarray[0]);
            int day = Integer.parseInt(strarray[1]);
            if(month > tmonth || (month == tmonth && (day < tday || day == tday))){  //
                System.out.println("需要提前一天预约，请重新输入：");
            }
            else if(strarray.length != 2 || month < 1 || month >12 || day <1 || day > 31){
                System.out.print("日期的格式为(1.15)，请重新输入：");
            }
            else
                return strarray[0] + "月" + strarray[1] + "日";


        }

    }

    public static String readOrderTime(){
        String str;
        Date date = new Date();
        SimpleDateFormat dateFormat = new SimpleDateFormat("HH: mm");
        while (true){
            str = readKeyBoard(4, 20, false);
            break;
//            if (str.charAt(2) != ':' && str.charAt(6) != '-'){
//                System.out.print("输入有误，请重新输入：");
//                continue;
//            }
//            System.out.println(dateFormat.format(date));
//            String dates = dateFormat.format(date);
//            String[] da = dates.split("~");
//            String[] str1 = str.split("~");
//            if (Integer.parseInt(str1[0]) > 12 && Integer.parseInt(str1[0]) < 1 &&
//                    Integer.parseInt(str1[1]) < 1 && Integer.parseInt(str1[1]) < 30){
//                System.out.println("输入有误，请重新输入：");
//            }
//            if (Integer.parseInt(da[0]) < Integer.parseInt(str1[0])){
//                break;
//            }
//            if (Integer.parseInt(da[0]) == Integer.parseInt(str1[0])){
//                if (Integer.parseInt(da[1]) < Integer.parseInt(str1[1])){
//                    break;
//                }else if (Integer.parseInt(da[1]) == Integer.parseInt(str1[1])){
//                    System.out.print("当前时间：" + dates + "，必须提前一天预约，请重新输入：");
//                }else if (Integer.parseInt(da[1]) > Integer.parseInt(str1[1])){
//                    System.out.print("当前时间：" + dates + "，不能小于当前时间，请重新输入：");
//                }
//            }
//            else{
//                System.out.print("当前时间：" + dates + "，不能小于当前时间，请重新输入：");
//            }
        }
        return str;
    }

    /**
     * Description: 教室人人数的输入
     * Author: 时间
     * Date: 2022/1/15 15:30
     */
    public static String readCount(){
        Pattern pattern = Pattern.compile("[0-9]*");
        String str;
        while (true){
            str = readKeyBoard(1, 3, false);
            if (pattern.matcher(str).matches()){
                return str;
            }
            System.out.print("输入不正确，请重新输入：");
        }
    }
}


